
package monopoli.communication;

import monopoli.Monopoli;

/**
 *
 * @author Marco
 */
public class HostPingPoller implements Runnable {
    
    public static final int INTERVAL_POLLING_TIME = 5000;      //5 secondi

    private Host host;



    //Costruttore
    HostPingPoller(Host host) {
        this.host = host;
    }



    
    @Override
    public void run() {

        //Ciclo finchè ho host da pingare
        do {

            try {

                //Mette in sleep il thread corrente
                Thread.sleep(INTERVAL_POLLING_TIME);
                
            } catch (InterruptedException ie) {
                System.out.println("[DBG_com] Sleeping time interrupted");
            }


            //Ricava il numero di host da pingare
            int num_host_to_ping = host.getNextPlayers().size();

            //Verifica che ci siano host da pingare
            if (num_host_to_ping == 0) { //CASO in cui la tokenRing ha subito troppi guasti
                
                //Aggiorna la variabile tokenRingFail
                host.updateTokenRingFail(true);

                //Aggiorna la InfoPlayer
                Monopoli.getMonopoliGUI().appendInfoPlayer("TOKEN RING CORROTTA");

            }
            else {  //CASO in cui la tokenRing è sana

                for (int i=0; i<num_host_to_ping; i++) {

                    //Ricava il ping_time dall'host attuale
                    try{
                        long res_ping = host.pingOneOfNextHost(i);
                        
                        if (res_ping==Message.TYPE_PING_FAIL && num_host_to_ping>0) {   //SOTTOCASO in cui il ping all'host è fallito
                                                                                    //e non si è raggiunto il limite di fail

                            //Eseguo il recover SOLO SE sono il nodo precedente
                            if ( i==0 ){

                                //Creazione thread di RecoverFail
                                Thread tRecoverFail = new RecoverFail(host);
                                tRecoverFail.setName("RECOVER_FromPingFail");
                                tRecoverFail.start();

                            }
                        }
                        else if ( res_ping==Message.TYPE_PING_FAIL || res_ping == Message.TYPE_TOKEN_RING_FAIL) {   //SOTTOCASO in cui il la token ring corrotta

                            //Aggiorna la variabile tokenRingFail
                            host.updateTokenRingFail(true);

                            //Aggiorna la InfoPlayer
                            Monopoli.getMonopoliGUI().appendInfoPlayer("TOKEN RING CORROTTA");

                        }
                        else    //SOTTOCASO in cui il ping è stato effettuato con successo
                            System.out.println("[DBG_com] Ping_poll effettuato a "
                                    + host.getNextPlayers().get(i).getRMIA().getBindName()
                                    + " con tempo di " + res_ping + "ms");
                    }
                    catch(IndexOutOfBoundsException ioe) {
                    }
                }
            }
            
        } while( !host.isTokenRingFail() );

        
        //Aggiorna la Debug Console
        Monopoli.getMonopoliGUI().debugMessage("[DBG_com] Non vi sono più host da pingare");

        //Invia informaziona al livello game
        Monopoli.getMonopoliPartita().getGameToCommunication().comunicaFinePartita();
        
    }

}
